/**
 * 发布-订阅模式实现类
 */
class EventCenter {
	constructor(arg) {
		if (new.target !== EventCenter) {
			return
		}
		if (!EventCenter.instance) {
			// 定义一个事件容器，用来装事件数组（因为订阅者可以是多个）
			this.handlers = {}
			EventCenter.instance = this
		}
		return EventCenter.instance
	}
	
	/**
	 * 事件添加方法
	 * @type { String } 事件名
	 * @handler { Function } 事件方法
	 */
	addEvent (type, handler) {
		// 判断handlers内有没有type事件容器，没有则创建一个新数组容器
		if (!(type in this.handlers)) {
			this.handlers[type] = []
		}
		// 将事件存入
		this.handlers[type].push(handler)
	}
	
	/**
	 * 事件派发方法
	 * @type { String } 事件名
	 * @params { Any } 事件参数
	 */
	dispatchEvent (type, ...params) {
		// 判断有无注册type事件
		if (!(type in this.handlers)) {
			return new Error('未注册该事件')
		}
		// 遍历派发事件
		this.handlers[type].forEach(handler => {
			handler(...params)
		})
	}
	
	/**
	 * 事件移除方法
	 * @type { String } 事件名
	 * @handler { Function } 事件方法
	 */
	removeEvent (type, handler) {
		// 无效事件抛出
		if (!(type in this.handlers)) {
			return new Error('无效事件')
		}
		// handler参数未传入则移除整个订阅
		if (!handler) {
			delete this.handlers[type]
		} else {
			const idx = this.handlers[type].findIndex(item => item === handler)
			if (idx === -1) {
				return new Error('该事件未绑定')
			}
			// 移除事件
			this.handlers[type].splice(idx, 1)
			if (this.handlers[type].length === 0) {
				delete this.handlers[type]
			}
		}
	}
}

export default new EventCenter()